[Raspberry Pi Project] How does Raspberry Pi boot?
一般嵌入式系統都是使用flash來當作system/storage Partition使用,但是RPi上卻是採用SD卡當system/storage partition,因為我過去的經驗中並沒有這樣的project經驗,所以讓我想研究一下RPi的系統啟動流程(以下的內容是以raspbian 3.6.11例子)
SD card partition
我們裝好的raspbian SD卡會被分成兩塊partition: FAT32的boot partition, EXT4的linux root partition. 對開機流程中,最重要關心的就是boot partition內的幾個檔案:
- bootcode.bin : 2nd stage bootloader
- start.elf / start_cd.elf / start_x.elf: The GPU binary firmware image (start_cd.elf是針對256MB RAM的model使用; start_x.elf是功能測試版)
- fixup.dat / fixup_cd.dat / fixup_x.dat: is used to configure the SDRAM partition between the GPU and the CPU (fixup_cd.dat是針對256MB RAM的model使用; fixup_x.dat是功能測試版)
- kernel.img: The OS kernel to load on the ARM processor.
- kernel_emergency.img : kernel with busybox rootfs. You can use this to repair the main linux partition using e2fsck if the linux partition gets corrupted.
- cmdline.txt: Parameters passed to the kernel on boot.
- config.txt: A configuration file read by the GPU. Use this to override set the video mode, alter system clock speeds, voltages, etc. 上面提到的bootcode.bin , start.elf, fixup.dat 因為都不是open source(應該都是Broadcom 維護),所以只能直接抓binary更新(git://github.com/raspberrypi/firmware.git)
上面提到的bootcode.bin , start.elf, fixup.dat 因為都不是open source(應該都是Broadcom 維護),所以只能直接抓binary更新(git://github.com/raspberrypi/firmware.git)
而kernel.img的部分就是我們可以自己抓source code下來re-build的部分(另一篇文章會提到)
Boot Process
- 當RPi一開機時,ARM core是off的狀態,GPU會先切到on. 此時SDRAM還是disabled.
- BCM2835上有一塊ROM燒好了first stage bootloader(出廠就燒好了,使用者不能再更新了).因此GPU一開始就會執行first stage bootloader. First stage bootloader會負責mount SD卡上的boot partition, 然後載入boot partition上的 bootcode.bin (the second stage bootloader) 到L2 cache上, 最後把執行權轉給bootcode.bin .
- bootcode.bin 會負責enables SDRAM,接著讀入 start.elf(GPU firmware).接著把執行權轉給start.elf
- start.elf負責喚起ARM core,並且依照fixup.dat內的設定載入kernel.img(linux kernel),接著讀取config.txt, cmdline.txt,依設定執行kernel(此時應該已經是ARM core執行了)
- Linux kernel啟動部分就不在此研究了
[參考]
http://elinux.org/RPi_Advanced_Setup#Setting_up_the_boot_partition